/// 🎯 年龄计算工具类
/// 
/// 提供年龄相关的计算功能
/// 统一管理年龄计算逻辑，确保数据一致性
/// 
/// 核心功能：
/// - 根据生日计算年龄
/// - 支持各种生日格式
/// - 处理边界情况
class AgeUtil {
  /// 根据生日字符串计算年龄
  /// 
  /// @param birthdayStr - 生日字符串，支持格式：
  ///   - "1990-01-01"
  ///   - "1990/01/01"
  ///   - "1990.01.01"
  /// @returns 年龄（整数），如果解析失败返回 0
  /// 
  /// 示例：
  /// ```dart
  /// final age = AgeUtil.calculateAge('1990-01-01');  // 34
  /// ```
  static int calculateAge(String? birthdayStr) {
    if (birthdayStr == null || birthdayStr.isEmpty) {
      return 0;
    }
    
    try {
      // 解析生日字符串
      final birthday = DateTime.parse(birthdayStr);
      final now = DateTime.now();
      
      // 计算年龄
      int age = now.year - birthday.year;
      
      // 检查是否已过生日
      // 如果今年还没过生日，年龄减1
      final hasHadBirthdayThisYear = now.month > birthday.month || 
          (now.month == birthday.month && now.day >= birthday.day);
      
      if (!hasHadBirthdayThisYear) {
        age--;
      }
      
      // 确保年龄不为负数
      return age >= 0 ? age : 0;
      
    } catch (e) {
      // 解析失败，尝试其他格式
      try {
        // 替换常见分隔符为标准格式
        final normalizedStr = birthdayStr
            .replaceAll('/', '-')
            .replaceAll('.', '-');
        
        final birthday = DateTime.parse(normalizedStr);
        final now = DateTime.now();
        
        int age = now.year - birthday.year;
        
        final hasHadBirthdayThisYear = now.month > birthday.month || 
            (now.month == birthday.month && now.day >= birthday.day);
        
        if (!hasHadBirthdayThisYear) {
          age--;
        }
        
        return age >= 0 ? age : 0;
        
      } catch (e) {
        // 完全解析失败，返回 0
        return 0;
      }
    }
  }
  
  /// 根据生日计算年龄（带默认生日）
  /// 
  /// @param birthdayStr - 生日字符串
  /// @param defaultBirthday - 默认生日，用于 birthdayStr 为空时
  /// @returns 年龄
  static int calculateAgeWithDefault(String? birthdayStr, {String defaultBirthday = '1970-01-01'}) {
    if (birthdayStr == null || birthdayStr.isEmpty) {
      return calculateAge(defaultBirthday);
    }
    return calculateAge(birthdayStr);
  }
  
  /// 获取年龄区间描述
  /// 
  /// @param age - 年龄
  /// @returns 年龄区间描述
  /// 
  /// 示例：
  /// ```dart
  /// AgeUtil.getAgeRange(25);  // "18-30岁"
  /// ```
  static String getAgeRange(int age) {
    if (age < 18) {
      return '未成年';
    } else if (age <= 30) {
      return '18-30岁';
    } else if (age <= 40) {
      return '31-40岁';
    } else if (age <= 50) {
      return '41-50岁';
    } else if (age <= 60) {
      return '51-60岁';
    } else {
      return '60岁以上';
    }
  }
  
  /// 判断是否成年
  /// 
  /// @param age - 年龄
  /// @returns 是否成年（默认18岁）
  static bool isAdult(int age, {int adultAge = 18}) {
    return age >= adultAge;
  }
  
  /// 根据生日判断星座
  /// 
  /// @param birthdayStr - 生日字符串
  /// @returns 星座名称
  static String getZodiacSign(String? birthdayStr) {
    if (birthdayStr == null || birthdayStr.isEmpty) {
      return '未知';
    }
    
    try {
      final birthday = DateTime.parse(birthdayStr);
      final month = birthday.month;
      final day = birthday.day;
      
      if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) return '白羊座';
      if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) return '金牛座';
      if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) return '双子座';
      if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) return '巨蟹座';
      if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) return '狮子座';
      if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) return '处女座';
      if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) return '天秤座';
      if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) return '天蝎座';
      if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) return '射手座';
      if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) return '摩羯座';
      if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) return '水瓶座';
      if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) return '双鱼座';
      
      return '未知';
    } catch (e) {
      return '未知';
    }
  }
}

